关于JavaScript 变量的定义与解析

Javascript 执行顺序探究

案例一:

1
2
3
4
5
<script>
alert(a);
var a=1;
alert(a);
</script>

弹窗弹出顺序 undefined->1;
解释:
javascript在执行前会进行类似“预编译”的操作,首先会创建一个当前执行环境下的活动对象,并将那些用var声明的变量设置为活动对象的属性,并赋值为undefined;
执行阶段,javascript是按照代码的先后顺序进行执行的,当遇到变量需要解析时,会首先从当前执行环境的活动对象中查找,如果没有找到而且该执行环境的拥有者有prototype属性时,则会从 prototype链中查找,否则将会按照作用域链查找。遇到var a = 1;这样的类赋值语句时会给相应的变量进行赋值(注意:变量的赋值是在执行阶段完成的,如果在这之前使用变量,它的值会是undefined);

根据上边的解释,则可以清楚的分析案例一的执行流程: 当文档加载结束后,首先进行预编译,将a设置为当前活动对象(window)的属性,并赋值为undefined,然后到了执行阶段,进行第一行的代码执行此时的a为undefined,故而弹出框中弹出的内容为undefined,然后走到第二行代码对a 进行赋值,此时a变为1,走第三行的时候弹出1;

案例二:

1
2
3
4
5
<script>    
//alert('a' in window);-->false
//alert('prototype' in window);-->false;
alert(a);
</script>

此时在chrom中不出现弹出框并报错为Uncaught ReferenceError: a is not defined;
firefox中不出现弹出框并报错为ReferenceError: a is not defined;
当文档加载完成后,没有发现var对变量的声明,进入执行,当遇到a时,进行去对window 查找,无果,window里又不存在prototype,找到最后也没有找到关于a 的信息,然后就只能告诉你 a is not defined;